import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { Category } from 'src/types/category.interface';

@Injectable()
export class CategoryService {
    //构造函数，通过InjectModel这个参数装饰器注入Banner模型
    constructor(@InjectModel('Category') private categoryModel: Model<Category>) {

    }
    async find(query): Promise<Category[]> {
        return this.categoryModel.find(query).exec();
    }
    async create(createCategoryDTO:Category|Category[]):Promise<Category|Category[]> {
        if(Array.isArray(createCategoryDTO)){
            return this.categoryModel.insertMany(createCategoryDTO)
        }else{
            return new this.categoryModel(createCategoryDTO).save()
        }
    }
    //返回前6个分类，以及每个分类下面的商品列表，每个分类下面会挂两个商品
    async findCategoriesWithProducts(): Promise<Category[]>{
        return this.categoryModel.aggregate([
            {
                $sort:{order:1}//按序号正序排列
            },
            {
                $limit:2 //限制结果为2条
            },
            {//使用$graphLookup进行深度递归查询，获取所有的后代分类
                $graphLookup:{
                    from:'categories',//要从哪个集合中查找
                    startWith:"$_id",//从当前文档中的哪个字段开始查 手机ID 661b828f2afb93b47246b384
                    connectFromField:'_id',
                    connectToField:'parent',
                    as:'allDescendants' //把查询到的文档保存到什么地方
                }
            },
            {//给当前的文档增加字段
                $addFields:{
                    allCategoryIds:{//把找到的子类的文档全部取出，每个文档依次进行映射得到文档的ID，也就是分类的ID，变成分类数组存到allCategoryIds字段
                        $map:{input:"$allDescendants",as:"item",in:"$$item._id"}
                    }
                }
            },
            {
                $lookup:{
                    from:'products',//从商品表里查询
                    let:{allCatIds:"$allCategoryIds"},
                    pipeline:[
                        {
                            $match:{
                                $expr:{//看看此商品的分类ID是否在子分类ID的数组里
                                    $in:["$category","$$allCatIds"]
                                }
                            }
                        },
                        {
                            $sort:{order:-1}//先按商品序号降序排列 
                        },
                        {
                            $limit:2//取前2条
                        }
                    ],
                    as:'products'
                }
            },
            {
                $project:{//指定返回的字段
                   _id:0,
                   order:1,
                   name:1,
                   products:1
                }
            }
        ]).exec()
    }
}
/**
$limit之后得到了这二个分类文档对象
{ "name": "手机"，"_id":"661b828f2afb93b47246b384",products:[...],allCategoryIds:['661b83172afb93b47246b399','661b83172afb93b47246b39a'...]}
{ "name": "穿戴"，"_id":"661b828f2afb93b47246b385",products:[...],allCategoryIds:['661b83172afb93b47246b39e','661b83172afb93b47246b39f'...]}

661b828f2afb93b47246b384 手机
   661b83172afb93b47246b399 Mate系列
      id Mate系列子分类
   661b83172afb93b47246b39a P系列
   661b83172afb93b47246b39b  nova系列
   661b83172afb93b47246b39c Pocket系列 
   661b83172afb93b47246b39d 华为畅想系列 
661b828f2afb93b47246b385 穿戴
   661b83172afb93b47246b39e WATCH Ultimate系列
   661b83172afb93b47246b39f WATCH系列
   661b83172afb93b47246b3a0 WATCH GT系列
   661b83172afb93b47246b3a1 手表/手环
   661b83172afb93b47246b3a2 健康及儿童手表



 * 
_id 手机ID 661b828f2afb93b47246b384
找哪个分类的parent字段等于 661b828f2afb93b47246b384
会找到5个文档，它们的父ID是661b828f2afb93b47246b384
再获取到这5个文档的_id
再找哪些文档的parent等于这5个文档的_id
一直往下递归查询，找到所有的文档

一共会找到几个文档？

 */